/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.vista.implementaciones;

import desarrollosoft.ghce.entidades.AntecedenteNoPatologico;
import desarrollosoft.ghce.entidades.Aspecto;
import desarrollosoft.ghce.entidades.Paciente;
import desarrollosoft.ghce.servicio.interfaces.IParserExcepciones;
import desarrollosoft.ghce.servicio.interfaces.IServicioAntecedentes;
import desarrollosoft.ghce.vista.interfaces.Avisable;
import desarrollosoft.ghce.vista.interfaces.Estado;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.select.SelectorComposer;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

/**
 *
 * @author ariel
 */
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ControladoraVentanaAntecedentesNoPatologicos extends SelectorComposer<Window> implements Avisable {

    @WireVariable("servicioAntecedentes")
    private IServicioAntecedentes servicioAntecedentes;
    
    @WireVariable("parserExcepcionesAntecedenteNoPatologico")
    private IParserExcepciones parserExcepcionesAntecedenteNoPatologico;
    
    private Paciente paciente;
    
    private List<Aspecto> listaAspectos;
    
    @Wire
    private Combobox comboboxAspectos;

    @Wire
    private Listbox listboxAntecedentesNoPatologicos;
    
    @Wire
    private Window ventanaDetalles;
    
    private Window ventanaAnterior;
    
    @Override
    public void doAfterCompose(Window comp) throws Exception {
        hacerAntesDeDibujar();
        super.doAfterCompose(comp);
        hacerDespuesDeDibujar();
    }

    public void hacerAntesDeDibujar() {
        Execution ejecucion = Executions.getCurrent();
        paciente = (Paciente) ejecucion.getArg().get("paciente");
    }
    
    public void hacerDespuesDeDibujar() {
        RenderAntecedentesNoPatologicos render = new RenderAntecedentesNoPatologicos();
        listboxAntecedentesNoPatologicos.setItemRenderer(render);
        listboxAntecedentesNoPatologicos.setModel(new ListModelList<>(servicioAntecedentes.obtenerAntecedentesNoPatologicos(paciente)));
        listaAspectos = servicioAntecedentes.obtenerTodosAspectos();
        Aspecto a = new Aspecto();
        a.setNombre("TODOS");
        a.setId(-1L);
        listaAspectos.add(0, a);
        comboboxAspectos.setModel(new ListModelList<>(listaAspectos));
    }
    
    @Listen("onClick = #botonBuscar")
    public void clickBotonBuscar() {
        int indiceSeleccionado = comboboxAspectos.getSelectedIndex();
        if (indiceSeleccionado <= 0) {
            listboxAntecedentesNoPatologicos.setModel(new ListModelList<>(servicioAntecedentes.obtenerAntecedentesNoPatologicos(paciente)));
        } else {
            Aspecto aspecto = listaAspectos.get(indiceSeleccionado);
            listboxAntecedentesNoPatologicos.setModel(new ListModelList<>(servicioAntecedentes.obtenerAntecedentesNoPatologicos(paciente, aspecto)));
        }
        mostrarDetalles(null, null, null);
    }
    
    @Listen("onClick = #botonCrear")
    public void clickBotonCrear() {
        if (paciente.getBajaLogicaPaciente() != null) {
            Messagebox.show("No puede modificar los datos de un paciente dado de baja");
            return;
        }
        int indiceSeleccionado = comboboxAspectos.getSelectedIndex();
        if (indiceSeleccionado <= 0) {
            Messagebox.show("Seleccione un Aspecto válido para crearlo");
            return;
        }
        Aspecto aspecto = listaAspectos.get(indiceSeleccionado);
        boolean loTieneCargado = servicioAntecedentes.loTieneCargado(paciente, aspecto);
        if (loTieneCargado) {
            Messagebox.show("El paciente, ya tiene el aspecto seleccionado creado");
            return;
        }
        mostrarDetalles(null, Estado.CREANDO, aspecto);
    }
    
    @Listen("onClick = #botonModificar")
    public void clickBotonModificar() {
        if (paciente.getBajaLogicaPaciente() != null) {
            Messagebox.show("No puede modificar los datos de un paciente dado de baja");
            return;
        }
        Listitem listitem = listboxAntecedentesNoPatologicos.getSelectedItem();
        if (listitem != null) {
            AntecedenteNoPatologico antecedente = listitem.getValue();
            if (antecedente != null) {
                mostrarDetalles(antecedente, Estado.MODIFICANDO, null);
            }
        }
    }
    
    @Listen("onClick = #botonEliminar")
    public void clickBotonEliminar() {
        if (paciente.getBajaLogicaPaciente() != null) {
            Messagebox.show("No puede modificar los datos de un paciente dado de baja");
            return;
        }
        Listitem listitem = listboxAntecedentesNoPatologicos.getSelectedItem();
        if (listitem != null) {
            final AntecedenteNoPatologico antecedenteNoPatologico = listitem.getValue();
            if (antecedenteNoPatologico != null) {
                Messagebox.show("¿Confirma que desea eliminar el Antecedente No Patológico seleccionado?", "Confirme por favor",
                        Messagebox.YES | Messagebox.NO, Messagebox.QUESTION,
                        new EventListener() {
                            @Override
                            public void onEvent(Event evt) throws InterruptedException {
                                if (evt.getName().equals("onYes")) { // si confirma
                                    try {
                                        servicioAntecedentes.eliminarAntecedenteNoPatologico(antecedenteNoPatologico);
                                    } catch (Exception e) {
                                        Messagebox.show(parserExcepcionesAntecedenteNoPatologico.parsear(e.toString()));
                                        return;
                                    }
                                    clickBotonBuscar(); // hago como que buscaron para actualizar la tabla
                                }
                            }
                        }
                );
            }
        }
    }
    
    @Listen("onSelect = #listboxAntecedentesNoPatologicos; onFocus = #listboxAntecedentesNoPatologicos")
    public void seleccionaronAntecedenteNoPatologico() {
        Listitem listitem = listboxAntecedentesNoPatologicos.getSelectedItem();
        if (listitem != null) {
            AntecedenteNoPatologico antecedente = listitem.getValue();
            if (antecedente != null) {
                mostrarDetalles(antecedente, Estado.CONSULTANDO, null);
                return;
            }
        }
        mostrarDetalles(null, null, null);
    }
    
    private void mostrarDetalles(AntecedenteNoPatologico antecedenteNoPatologico, Estado estado, Aspecto aspecto) {
        if (ventanaAnterior != null) {
            ventanaDetalles.removeChild(ventanaAnterior);
        }
        if (estado == null) {
            return;
        }
        
        Map<String, Object> argumentos = new HashMap<>();
        argumentos.put("paciente", paciente);
        argumentos.put("avisable", this);
        switch (estado) {
            case CONSULTANDO:
                argumentos.put("antecedenteNoPatologico",antecedenteNoPatologico);
                argumentos.put("estado", Estado.CONSULTANDO);
                ventanaAnterior = (Window) Executions.createComponents("VentanaDetallesAntecedenteNoPatologico.zul", null, argumentos);
                break;
            case MODIFICANDO:
                argumentos.put("antecedenteNoPatologico",antecedenteNoPatologico);
                argumentos.put("estado", Estado.MODIFICANDO);
                ventanaAnterior = (Window) Executions.createComponents("VentanaDetallesAntecedenteNoPatologico.zul", null, argumentos);
                break;
            case CREANDO:
                argumentos.put("estado", Estado.CREANDO);
                argumentos.put("aspecto", aspecto);
                ventanaAnterior = (Window) Executions.createComponents("VentanaDetallesAntecedenteNoPatologico.zul", null, argumentos);
                break;
        }
        if (ventanaAnterior != null) {
            ventanaDetalles.appendChild(ventanaAnterior);
        }
    }

    @Override
    public void seCerroVentanaHija(String nombre) {
        // llamado cuando guardan la ventana de detalles
        comboboxAspectos.setSelectedIndex(0);
        clickBotonBuscar();
        mostrarDetalles(null, null, null); // ??
    }
}
